package service

import (
	//"encoding/json"
	"fmt"
	"net/http"
	"pro_server/models"
//	"pro_server/utils"
	"time"

	"github.com/gin-gonic/gin"
	"gopkg.in/gomail.v2"

	"crypto/rand"
	"math/big"
)

func GetFriendList(c *gin.Context) {
	type userData struct{
		Id         int
		Identity   string
	}
	userdata := userData{}
	if err := c.BindJSON(&userdata); err != nil {
        // 若绑定失败，返回400 Bad Request错误
        c.JSON(http.StatusBadRequest, gin.H{
            "error": "无效的JSON数据: " + err.Error(),
        })
        //return
    }
    // 调用 GetFriendList 函数获取好友列表
    friendList, err := models.GetFriendList(userdata.Id)
    if err != nil {
        c.JSON(http.StatusInternalServerError, gin.H{
            "error": "获取好友列表失败: " + err.Error(),
        })
        return
    }

    // 返回成功响应，包含好友列表信息
    c.JSON(http.StatusOK, gin.H{
        "friendList": friendList,
    })
	
}

func GetVerifyCode(c *gin.Context) {

	// 生成随机数
	verifycode := getVerifycode()

	// 绑定JSON到email变量
	var jsonData struct {
		Email string
	}
	if err := c.ShouldBindJSON(&jsonData); err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"error": "请求体解析失败", "details": err.Error()})
		return
	}

	c.String(http.StatusOK, verifycode)
	sendemail(jsonData.Email, verifycode) //将信息发送到QQ邮箱

}

func CreateUser(c *gin.Context) {
	user := models.UserBasic{}
	if err := c.ShouldBindJSON(&user); err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"ermmror": err.Error()})
		return
	}

	data := models.FindUserById(user.Id)
	if data.Id != 0 {
		c.String(http.StatusOK, "注册失败,用户id已经存在")
		return
	}

	if user.Avatar == "" {
		user.Avatar = `asset\users_avatar_image\dog1.jpg`
	}

	user.Created_at = time.Now()
	user.Updated_at = time.Now()

	models.CreateUser(user)
	c.String(http.StatusOK, "注册成功")
}

func Login(c *gin.Context) {
	client_user := models.UserBasic{}
	if err := c.ShouldBindJSON(&client_user); err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		fmt.Println("Login函数中c.ShouldBindJSON(&client_user)出错:", err.Error())
		return
	}

	server_user := models.FindUserById(client_user.Id)
	if server_user.Id == 0 {
		c.JSON(200, gin.H{
			"code":    -1, //  0成功   -1失败
			"message": "该用户不存在",
		})
		return
	}

	if client_user.PassWord != server_user.PassWord {
		c.JSON(200, gin.H{
			"code":    -1, //  0成功   -1失败
			"message": "密码不正确",
		})
		return
	}
	server_user = models.GetUserData(client_user.Id)

	friendList, err := models.GetFriendList(server_user.Id)
    if err != nil {
        c.JSON(http.StatusInternalServerError, gin.H{
            "error": "获取好友列表失败: " + err.Error(),
        })
        return
    }

	//删减后需要传给客户端的数据
	data := models.ClientUser{}
	data.Id = server_user.Id
	data.Name = server_user.Name
	data.Email = server_user.Email
	data.Identity = server_user.Identity
	data.Avatar = server_user.Avatar
	data.FriendList = friendList
	c.JSON(200, gin.H{
		"code":     0, //  0成功   -1失败
		"message":  "身份验证成功",
		"userData": data,
	})

	//将http升级为websocket，建立客户端与服务端长连接，处理用户之间的消息
	//models.Chat(c.Writer,c.Request)

}


// 将信息发送到QQ邮箱
func sendemail(email string, verifycode string) {

	// 设置SMTP服务器地址和端口（QQ邮箱的SMTP服务器）
	smtpHost := "smtp.qq.com"
	smtpPort := 465 // 通常使用SSL连接时端口为465，或使用587进行STARTTLS连接

	// 设置发件人邮箱（使用你的QQ邮箱）
	username := "1845008301@qq.com"
	password := "nulwqbefkmrtbeci" // QQ邮箱授权码

	// 创建一个Dialer实例
	d := gomail.NewDialer(smtpHost, smtpPort, username, password)

	// 创建一个新的邮件消息
	m := gomail.NewMessage()
	m.SetHeader("From", username)
	m.SetHeader("To", email) // 收件人邮箱
	m.SetHeader("Subject", fmt.Sprintf("您好，您的验证码为：%s", verifycode))
	m.SetBody("text/plain", "本次验证码用于QQ邮箱验证,5分钟内有效,请勿泄露或转发。如非本人操作,请忽略此邮件")

	// 发送邮件
	if err := d.DialAndSend(m); err != nil {
		fmt.Println("Failed to send email:", err)
		return
	}

}

func getVerifycode() string {
	// 创建一个新的big.Int来表示最大值（999,999）
	max := new(big.Int).SetInt64(999999)

	// 创建一个空的big.Int来存储生成的随机数
	n, err := rand.Int(rand.Reader, max)
	if err != nil {
		// 处理错误
		panic(err)
	}

	// 将big.Int转换为int64（或根据需要转换为其他类型）
	// 注意：如果确信结果不会超出int64的范围，可以这样做
	// 但在这个例子中，因为我们知道它不会超过999,999，所以它是安全的
	verifycode := n.String()

	return verifycode
}
